#define _CRT_SECURE_NO_WARNINGS 1
//#include <iostream>
//#include <string>
//#include <cctype>
//
//using namespace std;
//
//int pd = 0, len, len1;
//string one, other_one;
//
//void change_upper(string& s);
//void compare(size_t n, size_t n1);
//
//int main()
//{
//    cin >> one >> other_one;
//
//    len = one.size();
//    len1 = other_one.size();
//
//    change_upper(one);
//    change_upper(other_one);
//
//    compare(0, 0);
//    if (one == other_one) cout << "true";
//    else if (1 == pd) cout << "true";
//    else cout << "false";
//
//    return 0;
//}
//
//void change_upper(string& s)
//{
//    for (auto& c : s)
//        if (isalpha(c))
//            c = toupper(c);
//}
//
//void compare(size_t n, size_t n1)
//{
//    if (n1 == len1)
//    {
//        while (n < len)
//        {
//            if ('*' == one[n] || '?' == one[n])
//            {
//                ++n;
//                continue;
//            }
//            return;
//        }
//        pd = 1;
//        return;
//    }
//    if (n == len)return;
//    if (one[n] != other_one[n1])
//    {
//        if ('?' == one[n] && (isalpha(other_one[n1])
//            || isalnum(other_one[n1])))
//        {
//            size_t size = 0;
//            while (size < 2 && n1 + size <= len1)
//            {
//                compare(n + 1, n1 + size);
//                ++size;
//            }
//        }
//        else if ('*' == one[n])
//        {
//            while ('*' == one[n + 1])++n;
//            size_t size = 0;
//            while ((isalpha(other_one[n1])
//                || isalnum(other_one[n1])) && n1 + size <= len1)
//            {
//                compare(n + 1, n1 + size);
//                ++size;
//            }
//        }
//        else
//        {
//            return;
//        }
//    }
//    if (n == len - 1 && n1 < len1 - 1)return;
//    //if (one[n] == other_one[n1])cout << one[n] << " " << other_one[n1] << endl;
//    if (one[n] == other_one[n1])compare(n + 1, n1 + 1);
//}